library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.6     ✓ dplyr   1.0.6
✓ tidyr   1.1.3     ✓ stringr 1.4.0
✓ readr   1.4.0     ✓ forcats 0.5.1
── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(plotly)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(rcartocolor)
merged <- read_tsv('../output/merged_table.tsv')

── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  Specialty = col_character(),
  `No. of Programs` = col_double(),
  `Positions Offered` = col_double(),
  `Unfilled Programs` = col_double(),
  `MD Senior Applicants` = col_double(),
  `Total Applicants` = col_double(),
  `MD Senior Matches` = col_double(),
  `Total Matches` = col_double(),
  `MD Senior % Filled` = col_double(),
  `Total % Filled` = col_double(),
  `MD Senior Ranked Positions` = col_double(),
  `Total Ranked Positions` = col_character(),
  Year = col_double(),
  Class = col_character()
)
merged %>% 
  filter(Specialty == 'Dermatology') 
long_table_absolute <- merged %>% 
  select(Specialty,
         Year,
         Class,
         `Positions Offered`,
         `MD Senior Applicants`,
         `Total Applicants`,
         `MD Senior Matches`,
         `Total Matches`) %>% 
  pivot_longer(cols = -c(Specialty, Year, Class),
               names_to = 'Name',
               values_to = 'Value') %>% 
  arrange(Specialty, Class, Year)

long_table_absolute
long_table_percent <-  merged %>% 
  select(Specialty,
         Year,
         Class, 
         `MD Senior % Filled`,
         `Total % Filled`) %>% 
  pivot_longer(cols = -c(Specialty, Year, Class),
               names_to = 'Name',
               values_to = 'Value') %>% 
  arrange(Specialty, Class, Year)

long_table_percent 
p <- long_table %>% 
  #filter(Specialty == 'Dermatology') %>% 
  ggplot(aes(x = Year,
             y = Value,
             color = Name)) +
  geom_point() +
  geom_line() + 
  facet_wrap(~Specialty + Class, scales = 'free_y') +
  theme_bw() +
  scale_color_carto_d(palette = 'Bold') 

p
geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?
geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?
geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?
geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?
geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?

input_data <- merged %>% filter(Specialty == 'Dermatology',
                                Class == 'PGY2')#long_table_absolute %>% filter(Specialty == 'Dermatology')

fig <- plot_ly(input_data, x = ~Year)
fig <- fig %>% add_trace(y = ~`Positions Offered`, name = 'Positions Offered', mode = 'lines+markers')
fig <- fig %>% add_trace(y = ~`MD Senior Applicants`, name = 'MD Senior Applicants', mode = 'lines+markers')
fig <- fig %>% add_trace(y = ~`Total Applicants`, name = 'Total Applicants', mode = 'lines+markers')

fig
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#scatter
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#scatter
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#scatter
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#scatter
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#scatter
No trace type specified:
  Based on info supplied, a 'scatter' trace seems appropriate.
  Read more about this trace type -> https://plotly.com/r/reference/#scatter
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkocmNhcnRvY29sb3IpCmBgYAoKYGBge3J9Cm1lcmdlZCA8LSByZWFkX3RzdignLi4vb3V0cHV0L21lcmdlZF90YWJsZS50c3YnKQpgYGAKCmBgYHtyfQptZXJnZWQgJT4lIAogIGZpbHRlcihTcGVjaWFsdHkgPT0gJ0Rlcm1hdG9sb2d5JykgCmBgYAoKYGBge3J9CmxvbmdfdGFibGVfYWJzb2x1dGUgPC0gbWVyZ2VkICU+JSAKICBzZWxlY3QoU3BlY2lhbHR5LAogICAgICAgICBZZWFyLAogICAgICAgICBDbGFzcywKICAgICAgICAgYFBvc2l0aW9ucyBPZmZlcmVkYCwKICAgICAgICAgYE1EIFNlbmlvciBBcHBsaWNhbnRzYCwKICAgICAgICAgYFRvdGFsIEFwcGxpY2FudHNgLAogICAgICAgICBgTUQgU2VuaW9yIE1hdGNoZXNgLAogICAgICAgICBgVG90YWwgTWF0Y2hlc2ApICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IC1jKFNwZWNpYWx0eSwgWWVhciwgQ2xhc3MpLAogICAgICAgICAgICAgICBuYW1lc190byA9ICdOYW1lJywKICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gJ1ZhbHVlJykgJT4lIAogIGFycmFuZ2UoU3BlY2lhbHR5LCBDbGFzcywgWWVhcikKCmxvbmdfdGFibGVfYWJzb2x1dGUKYGBgCmBgYHtyfQpsb25nX3RhYmxlX3BlcmNlbnQgPC0gIG1lcmdlZCAlPiUgCiAgc2VsZWN0KFNwZWNpYWx0eSwKICAgICAgICAgWWVhciwKICAgICAgICAgQ2xhc3MsIAogICAgICAgICBgTUQgU2VuaW9yICUgRmlsbGVkYCwKICAgICAgICAgYFRvdGFsICUgRmlsbGVkYCkgJT4lIAogIHBpdm90X2xvbmdlcihjb2xzID0gLWMoU3BlY2lhbHR5LCBZZWFyLCBDbGFzcyksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gJ05hbWUnLAogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAnVmFsdWUnKSAlPiUgCiAgYXJyYW5nZShTcGVjaWFsdHksIENsYXNzLCBZZWFyKQoKbG9uZ190YWJsZV9wZXJjZW50IApgYGAKCmBgYHtyfQpwIDwtIGxvbmdfdGFibGVfYWJzb2x1dGUgJT4lIAogICNmaWx0ZXIoU3BlY2lhbHR5ID09ICdEZXJtYXRvbG9neScpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBZZWFyLAogICAgICAgICAgICAgeSA9IFZhbHVlLAogICAgICAgICAgICAgY29sb3IgPSBOYW1lKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9saW5lKCkgKyAKICBmYWNldF93cmFwKH5TcGVjaWFsdHkgKyBDbGFzcywgc2NhbGVzID0gJ2ZyZWVfeScpICsKICB0aGVtZV9idygpICsKICBzY2FsZV9jb2xvcl9jYXJ0b19kKHBhbGV0dGUgPSAnQm9sZCcpIAoKcApgYGAKCmBgYHtyfQppbnB1dF9kYXRhIDwtIG1lcmdlZCAlPiUgZmlsdGVyKFNwZWNpYWx0eSA9PSAnRGVybWF0b2xvZ3knLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzID09ICdQR1kyJykjbG9uZ190YWJsZV9hYnNvbHV0ZSAlPiUgZmlsdGVyKFNwZWNpYWx0eSA9PSAnRGVybWF0b2xvZ3knKQoKZmlnIDwtIHBsb3RfbHkoaW5wdXRfZGF0YSwgeCA9IH5ZZWFyKQpmaWcgPC0gZmlnICU+JSBhZGRfdHJhY2UoeSA9IH5gUG9zaXRpb25zIE9mZmVyZWRgLCBuYW1lID0gJ1Bvc2l0aW9ucyBPZmZlcmVkJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJykKZmlnIDwtIGZpZyAlPiUgYWRkX3RyYWNlKHkgPSB+YE1EIFNlbmlvciBBcHBsaWNhbnRzYCwgbmFtZSA9ICdNRCBTZW5pb3IgQXBwbGljYW50cycsIG1vZGUgPSAnbGluZXMrbWFya2VycycpCmZpZyA8LSBmaWcgJT4lIGFkZF90cmFjZSh5ID0gfmBUb3RhbCBBcHBsaWNhbnRzYCwgbmFtZSA9ICdUb3RhbCBBcHBsaWNhbnRzJywgbW9kZSA9ICdsaW5lcyttYXJrZXJzJykKCmZpZwpgYGAKCg==